package fr.afcepf.atod18.restaurants.web;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ComponentSystemEvent;

import fr.afcepf.atod18.client.entity.Client;
import fr.afcepf.atod18.restaurants.entity.Restaurant;
import fr.afcepf.atod18.restaurants.entity.TypeCuisine;
import fr.afcepf.atod18.utilitaires.entity.Adresse;
import fr.afcepf.atod18.utilitaires.entity.InfoSession;
import fr.afcepf.atod18.utilitaires.entity.Login;
import fr.afcepf.atod18.utilitaires.entity.Profil;
import fr.afcepf.atod18.utilitaires.entity.Rue;
import fr.afcepf.atod18.utilitaires.entity.TypeAdresse;
import fr.afcepf.atod18.utilitaires.entity.Ville;
import fr.afcepf.atod18.utilitaires.service.IServiceFacade;
import fr.afcepf.atod18.utilitaires.web.ConnexionMB;

@ManagedBean(name = "creeRestauMB")
@SessionScoped
public class CreeRestauMB {
	@ManagedProperty(value = "#{serviceFacade}")
	IServiceFacade serviceFacade;

	private InfoSession infoSession;

	private Login login;
	private String nom;
	private String emailContact;
	private String nomContact;
	private String prenomContact;
	private Adresse adresse;
	private Rue rue;
	private Integer numeroRue;
	private Ville ville;
	private Integer codePostal;
	private List<TypeCuisine> specialites;

	private String messageCpt;

	private Restaurant resto;

	public IServiceFacade getServiceFacade() {
		return serviceFacade;
	}

	public void setServiceFacade(IServiceFacade serviceFacade) {
		this.serviceFacade = serviceFacade;
	}

	public InfoSession getInfoSession() {
		return infoSession;
	}

	public void setInfoSession(InfoSession infoSession) {
		this.infoSession = infoSession;
	}

	public Login getLogin() {
		return login;
	}

	public void setLogin(Login login) {
		this.login = login;
	}

	public String getNom() {
		return nom;
	}

	public void setNom(String nom) {
		this.nom = nom;
	}

	public String getEmailContact() {
		return emailContact;
	}

	public void setEmailContact(String emailContact) {
		this.emailContact = emailContact;
	}

	public String getNomContact() {
		return nomContact;
	}

	public void setNomContact(String nomContact) {
		this.nomContact = nomContact;
	}

	public String getPrenomContact() {
		return prenomContact;
	}

	public void setPrenomContact(String prenomContact) {
		this.prenomContact = prenomContact;
	}

	public Adresse getAdresse() {
		return adresse;
	}

	public void setAdresse(Adresse adresse) {
		this.adresse = adresse;
	}

	public Rue getRue() {
		return rue;
	}

	public void setRue(Rue rue) {
		this.rue = rue;
	}

	public Integer getNumeroRue() {
		return numeroRue;
	}

	public void setNumeroRue(Integer numeroRue) {
		this.numeroRue = numeroRue;
	}

	public Ville getVille() {
		return ville;
	}

	public void setVille(Ville ville) {
		this.ville = ville;
	}

	public Integer getCodePostal() {
		return codePostal;
	}

	public void setCodePostal(Integer codePostal) {
		this.codePostal = codePostal;
	}

	public String getMessageCpt() {
		return messageCpt;
	}

	public void setMessageCpt(String messageCpt) {
		this.messageCpt = messageCpt;
	}

	public Restaurant getResto() {
		return resto;
	}

	public void setResto(Restaurant resto) {
		this.resto = resto;
	}

	
	public List<TypeCuisine> getSpecialites() {
		return specialites;
	}

	public void setSpecialites(List<TypeCuisine> specialites) {
		this.specialites = specialites;
	}

	@PostConstruct
	public void doInit() {
		System.out.println("Init Nouveau resto");

		nom = "";
		emailContact = "";
		nomContact = "";
		prenomContact = "";

		System.out.println("nouveau client");
		login = new Login();

		adresse = new Adresse();
		ville = new Ville();
		rue = new Rue();

		Profil profil = serviceFacade.getServiceProfil()
				.rechercherParNom("libelle", "Restaurateur").get(0);
		resto = new Restaurant(nom, 25, 30, null, null);
		specialites = serviceFacade.getServiceTypeCuisine().rechercherTout();
		//specialites.get(0).getLibelle()
	}

	private boolean validate() {
		messageCpt = "";
		if (nom.equals("")) {
			messageCpt = "Le nom du restaurant est obligatoire";
			return false;
		}
		if (emailContact.equals("")) {
			messageCpt = "L'email du contact du restaurant est obligatoire";
			return false;
		}
		if (nomContact.equals("")) {
			messageCpt = "Le nom du contact du restaurant est obligatoire";
			return false;
		}
		messageCpt = "";
		List<Login> logins = serviceFacade.getServiceLogin().rechercherParNom(
				"email", login.getEmail());
		if (!(logins == null || logins.size() == 0)) {
			messageCpt = "Compte Existant";
			login = new Login();
			return false;
		}

		return true;
	}

	public String doSauve() {
		if (validate()) {
			System.out.println("Validé");
			ville.setCodePostal(codePostal);
			adresse.setNumeroRue(numeroRue);
			serviceFacade.getServiceVille().ajouter(ville);
			adresse.setVille(ville);
			serviceFacade.getServiceRue().ajouter(rue);
			adresse.setRue(rue);
			serviceFacade.getServiceAdresse().ajouter(adresse);
			resto.setAdresse(adresse);
			
			login.setEmail(getEmailContact());
			login.setPassword("");
			
			// on sauvegarde le restaurant, puis le compte du restaurateur
			
			serviceFacade.getServiceRestaurant().ajouter(resto);
			serviceFacade.getServiceLogin().ajouter(login);
			

//			FacesContext fc = FacesContext.getCurrentInstance();
//			if (fc != null && fc.getExternalContext() != null) {
//				infoSession = (InfoSession) fc.getExternalContext()
//						.getApplicationMap().get("infoSession");
//			}

			return "AccueilAdmin";
		} 
		else {
			return null;
		}

	}
}
